package com.weaving.monitor.service;

import com.weaving.monitor.dto.MachineStatusDto;
import com.weaving.monitor.entity.Machine;
import com.weaving.monitor.mapper.MachineMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 经编机服务类
 * 
 * 功能说明：
 * 1. 提供经编机相关的业务逻辑处理
 * 2. 封装数据访问层的操作
 * 3. 实现实体对象与DTO之间的转换
 * 4. 为控制器层提供数据服务
 * 
 * 注解说明：
 * - @Service: Spring注解，标识这是一个服务类，会被Spring容器管理
 * - @RequiredArgsConstructor: Lombok注解，自动生成包含final字段的构造函数
 * 
 * 依赖说明：
 * - MachineMapper: 经编机数据访问接口，用于数据库操作
 * 
 * 主要方法：
 * 1. getAllMachineStatus: 获取所有机器的状态信息
 * 2. getMachineStatus: 获取指定机器的状态信息
 * 3. convertToDto: 将实体对象转换为DTO对象
 * 
 * @author 系统开发团队
 * @version 1.0
 * @since 2024-01-01
 */
@Service
@RequiredArgsConstructor
public class MachineService {
    
    /** 经编机数据访问接口，通过构造函数注入 */
    private final MachineMapper machineMapper;
    
    /** 工人姓名查询服务，通过字段注入 */
    @Autowired
    private WorkerNameService workerNameService;
    
    /** 梳栉花型查询服务，通过字段注入 */
    @Autowired
    private PatternService patternService;
    
    /**
     * 获取所有机器的状态信息
     * 
     * 功能说明：
     * 1. 从数据库查询所有机器的信息
     * 2. 将实体对象转换为DTO对象
     * 3. 返回机器状态列表，用于前端展示
     * 
     * 处理流程：
     * 1. 调用mapper查询所有机器数据
     * 2. 使用Stream API将每个Machine对象转换为MachineStatusDto
     * 3. 收集转换后的DTO对象到List中
     * 
     * @return 所有机器状态信息的列表
     */
    public List<MachineStatusDto> getAllMachineStatus() {
        // 从数据库查询所有机器信息
        List<Machine> machines = machineMapper.selectAllMachines();
        
        // 将实体对象转换为DTO对象并返回
        return machines.stream()
                .map(this::convertToDto)
                .collect(Collectors.toList());
    }
    
    /**
     * 获取指定机器的状态信息
     * 
     * 功能说明：
     * 1. 根据机器号查询特定机器的信息
     * 2. 将实体对象转换为DTO对象
     * 3. 如果机器不存在则返回null
     * 
     * @param machineNumber 机器编号
     * @return 指定机器的状态信息，如果不存在则返回null
     */
    public MachineStatusDto getMachineStatus(Integer machineNumber) {
        // 根据机器号查询机器信息
        Machine machine = machineMapper.selectByMachineNumber(machineNumber);
        
        // 如果机器存在则转换为DTO，否则返回null
        return machine != null ? convertToDto(machine) : null;
    }
    
    /**
     * 将Machine实体对象转换为MachineStatusDto对象
     * 
     * 功能说明：
     * 1. 实现实体对象到DTO对象的映射转换
     * 2. 隐藏实体对象的内部结构
     * 3. 提供统一的数据传输格式
     * 4. 将工人卡号转换为真实姓名
     * 
     * 转换规则：
     * - 直接复制所有基本属性
     * - 保持数据类型的一致性
     * - 将工人卡号转换为真实姓名
     * - 不进行其他数据格式转换
     * 
     * @param machine 要转换的Machine实体对象
     * @return 转换后的MachineStatusDto对象
     */
    private MachineStatusDto convertToDto(Machine machine) {
        // 创建新的DTO对象
        MachineStatusDto dto = new MachineStatusDto();
        
        // 复制所有属性值
        dto.setMachineNumber(machine.getMachineNumber());
        dto.setModel(machine.getModel());
        dto.setFabricLength(machine.getFabricLength());
        
        // 将工人卡号转换为真实姓名
        String workerName = workerNameService.getWorkerNameByCardNumber(machine.getOperator());
        dto.setOperator(workerName);
        
        // 设置当前生产物料类型
        dto.setCurrentMatTypeName(machine.getCurrentMatTypeName());
        
        dto.setSpeed(machine.getSpeed());
        
        // 从数据库查询梳栉花型信息
//        String machineId = "J" + String.format("%03d", machine.getMachineNumber());
//        dto.setL1Pattern(patternService.getPatternByMachineAndGbNum(machineId, 1));
//        dto.setL1Remaining(machine.getL1Remaining());
//        dto.setL2Pattern(patternService.getPatternByMachineAndGbNum(machineId, 2));
//        dto.setL2Remaining(machine.getL2Remaining());
//        dto.setL3Pattern(patternService.getPatternByMachineAndGbNum(machineId, 3));
//        dto.setL3Remaining(machine.getL3Remaining());
//        dto.setL4Pattern(patternService.getPatternByMachineAndGbNum(machineId, 4));
//        dto.setL4Remaining(machine.getL4Remaining());

        dto.setL1Pattern(machine.getL1Pattern());
        dto.setL1Remaining(machine.getL1Remaining());
        dto.setL2Pattern(machine.getL2Pattern());
        dto.setL2Remaining(machine.getL2Remaining());
        dto.setL3Pattern(machine.getL3Pattern());
        dto.setL3Remaining(machine.getL3Remaining());
        dto.setL4Pattern(machine.getL4Pattern());
        dto.setL4Remaining(machine.getL4Remaining());
        dto.setNextPlan(machine.getNextPlan());
        dto.setStatus(machine.getStatus());
        dto.setLastUpdated(machine.getLastUpdated());
        
        return dto;
    }
} 